/* @author cerimice */
package Logica.Modulo.Apartados;

import Persistencia.Definicion.Apartado;
import Persistencia.Fachada.ApartadoFachada;
import Persistencia.Fachada.ListaFachada;
import Reportes.PDF.Apartado.ReporteGenerarApartado;
import Sistema.Configuracion;
import cerimice.ValidarDatos;
import com.vaadin.ui.Table;
import java.util.Date;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;

public class GenerarApartadoLogica
    {
    private String  error;
    private String  claveApartado;
    
    private ValidarDatos    valida;
    private ListaFachada    lista;
    private ApartadoFachada fachada;
    
    public GenerarApartadoLogica()
        {
        lista   = new ListaFachada();
        fachada = new ApartadoFachada();
        valida = new ValidarDatos();
        }
    
    public String getError()
        {return error;}
    
    public Apartado getApartado(String clave) throws Exception
        {
        try
            {return fachada.obtener(clave);}
        catch (Exception Ex)
            {Logger.getLogger(this.getClass().getName()).log(Configuracion.nivelLoggin(),Ex.getMessage()); throw Ex;}
        }
    
    public Table generarTabla(int tipo,String valor,Table tabla) throws Exception
        {
        try
            {
            tabla.removeAllItems();
            List<Apartado> listado = lista.listaApartado(tipo,"%"+valor);
            for(Apartado obj:listado)
                {tabla.addItem(new Object[]{obj.getClave(),obj.getObjCliente().getNombreCompleto(),obj.getObjMarca().getNombre(),obj.getDescripcion()},obj.getClave());}
            return tabla;
            }
        catch (Exception Ex)
            {Logger.getLogger(this.getClass().getName()).log(Configuracion.nivelLoggin(),Ex.getMessage()); throw Ex;}
        }
    
    public List getListaMarca() throws Exception
        {
        try
            {return lista.listaMarca();}
        catch (Exception Ex)
            {Logger.getLogger(this.getClass().getName()).log(Configuracion.nivelLoggin(),Ex.getMessage()); throw Ex;}
        }
    
    public boolean agregarObjeto(String cliente,Date fechaInicio,Date fechaTermino,String descripcion,String marca,String numeroSerie,String montoTotal) throws Exception
        {
        try
            {
            if(validarDatos(cliente,fechaInicio,fechaTermino,descripcion,marca,numeroSerie, montoTotal))
                {
                if(fachada.agregar(cliente, fechaInicio, fechaTermino, descripcion, marca, numeroSerie,Float.parseFloat(montoTotal)))
                    {
                    claveApartado = fachada.getClaveApartado();
                    return true;
                    }
                return false;
                }
            return false;
            }
        catch (Exception Ex)
            {Logger.getLogger(this.getClass().getName()).log(Configuracion.nivelLoggin(),Ex.getMessage()); throw Ex;}
        }
    
    public boolean agregarObjeto(String cliente,Date fechaInicio,Date fechaTermino,String descripcion,String marca,String numeroSerie,String montoTotal,String pagoInicial) throws Exception
        {
        try
            {
            if(validarDatos(cliente,fechaInicio,fechaTermino,descripcion,marca,numeroSerie,montoTotal,pagoInicial))
                {
                if(fachada.agregar(cliente, fechaInicio, fechaTermino, descripcion, marca, numeroSerie,Float.parseFloat(montoTotal),Float.parseFloat(pagoInicial)))
                    {
                    claveApartado = fachada.getClaveApartado();
                    return true;
                    }
                return false;
                }
            return false;
            }
        catch (Exception Ex)
            {Logger.getLogger(this.getClass().getName()).log(Configuracion.nivelLoggin(),Ex.getMessage()); throw Ex;}
        }
    
    public boolean modificarObjeto(String clave,String cliente,Date fechaInicio,Date fechaTermino,String descripcion,String marca,String numeroSerie,String montoTotal) throws Exception
        {
        try
            {
            if(validarDatos(cliente, fechaInicio, fechaTermino, descripcion, marca, numeroSerie,montoTotal))
                {
                if(fachada.modificar(clave,cliente, fechaInicio, fechaTermino, descripcion, marca, numeroSerie,Float.parseFloat(montoTotal)))
                    {return true;}
                return false;
                }
            return false;
            }
        catch (Exception Ex)
            {Logger.getLogger(this.getClass().getName()).log(Configuracion.nivelLoggin(),Ex.getMessage()); throw Ex;}
        }
    
    public ReporteGenerarApartado reporteGenerarApartado() throws Exception
        {
        try
            {return new ReporteGenerarApartado(claveApartado);}
        catch (Exception Ex)
            {Logger.getLogger(this.getClass().getName()).log(Configuracion.nivelLoggin(),Ex.getMessage()); throw Ex;}
        }
    
    public ReporteGenerarApartado reporteGenerarApartado(String clave) throws Exception
        {
        try
            {return new ReporteGenerarApartado(clave);}
        catch (Exception Ex)
            {Logger.getLogger(this.getClass().getName()).log(Configuracion.nivelLoggin(),Ex.getMessage()); throw Ex;}
        }
    
    private boolean validarDatos(String cliente,Date fechaInicio,Date fechaTermino,String descripcion,String marca,String numeroSerie,String montoTotal)
        {
        if(!valida.isCadena(cliente))       {error = "El campo CLIENTE no es valido"; return false;}
        if(fechaInicio.after(fechaTermino))  {error = "El campo FECHA INICIO no puede ser posterior a la FECHA DE TERMINO"; return false;}
        //if(!valida.isFecha(fechaTermino)) {error = "El campo FECHA TERMINO no es valido"; return false;}
        if(!valida.isCadena(descripcion))   {error = "El campo DESCRIPCION no es valido"; return false;}
        if(!valida.isCadena(marca))         {error = "El campo MARCA no es valido"; return false;}
        if(!valida.isCadena(numeroSerie))   {error = "El campo NUMERO DE SERIE no es valido"; return false;}
        if(!valida.isFlotante(montoTotal))  {error = "El campo PAGO MONTO TOTAL no es valido"; return false;}
        if(Float.parseFloat(montoTotal)<0)  {error = "El campo PAGO MONTO TOTAL no es valido"; return false;}
        return true;
        }
    
    private boolean validarDatos(String cliente,Date fechaInicio,Date fechaTermino,String descripcion,String marca,String numeroSerie,String montoTotal,String pagoInicial)
        {
        if(!valida.isCadena(cliente))       {error = "El campo CLIENTE no es valido"; return false;}
        if(fechaInicio.after(fechaTermino))  {error = "El campo FECHA INICIO no puede ser posterior a la FECHA DE TERMINO"; return false;}
        //if(!valida.isFecha(fechaTermino)) {error = "El campo FECHA TERMINO no es valido"; return false;}
        if(!valida.isCadena(descripcion))   {error = "El campo DESCRIPCION no es valido"; return false;}
        if(!valida.isCadena(marca))         {error = "El campo MARCA no es valido"; return false;}
        if(!valida.isCadena(numeroSerie))   {error = "El campo NUMERO DE SERIE no es valido"; return false;}
        if(!valida.isFlotante(montoTotal))  {error = "El campo PAGO MONTO TOTAL no es valido"; return false;}
        if(Float.parseFloat(montoTotal)<0)  {error = "El campo PAGO MONTO TOTAL no es valido"; return false;}
        if(!valida.isFlotante(pagoInicial)) {error = "El campo PAGO INICIAL no es valido"; return false;}
        if(Float.parseFloat(pagoInicial)<0) {error = "El campo PAGO INICIAL no es valido"; return false;}
        return true;
        }
    }
